package com.cskaoyan.javase.array._3exception._4operation._0traverse;

/**
 * 数组的遍历（traverse）是最最基本的操作，是进行数组中其它操作的基础。
 * 它的含义是依次访问（或输出）数组中的每一个元素。
 *
 * 数组的遍历最常见的自己实现的方式是：
 *      手写for循环遍历数组
 *
 *
 * @since 15:10
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        /*for (int i = 0; i < 3; i++) {
            System.out.println(arr[i]);
        }
        System.out.println("----------------------");*/
        // for循环遍历数组的快捷键
        // 数组名.fori
        // for (int i = 0; i < arr.length; i++) {
        //     System.out.println(arr[i]);
        // }
        // arr = new int[0];
        // arr = null;
        traverse7(arr);
    }

    public static void traverse(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

    /*
        以上数组的遍历输出不够美观
        我们希望看到的数组遍历输出的样式是: [1, 2, 3]
      */
    public static void traverse2(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("]");
    }

    /*
        上述输出[1, 2, 3, ]
        需要优化改进为
        [1, 2, 3]
        可以选择使用转义字符"\b"
     */
    public static void traverse3(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }

    // 使用if判断去掉", "
    public static void traverse4(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            // 如果是最后一个元素就不加逗号和空格了
            if (i == arr.length - 1) {
                System.out.print(arr[i]);
                break;
            }
            System.out.print(arr[i] + ", ");
        }
        System.out.println("]");
    }

    /*
        以上方法的格式已经足够美观了
        但是方法仍然不够完善
        因为方法不能够接收特殊的数组输入
        比如长度为0的数组和null数组

        这里先改进,使得方法能够接收长度为0的输入
        并且能够给出友好的提示
     */
    public static void traverse5(int[] arr) {
        /*
            这里判断数组
                是判断数组长度为0好?
                还是不为0好?
                显然是判断==0好 因为等于0时
                    要执行的代码更少
                    代码的层级会更加清楚

             对于if选择结构来说
                if大括号中要执行的代码
                是越多越好?
                还是越少越好?
                当然是越少越好
                因为大括号会显著增加代码层级
                    大括号包裹的代码越少
                    代码的层级就越清晰!
         */
        if (arr.length == 0) {
            System.out.println("您输入的数组是长度为0的数组,请重新输入!");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            // 如果是最后一个元素就不加逗号和空格了
            if (i == arr.length - 1) {
                System.out.print(arr[i]);
                break;
            }
            System.out.print(arr[i] + ", ");
        }
        System.out.println("]");
    }

    /*
        接下来
        继续改进
        使得方法能够接收null数组的输入
     */
    public static void traverse6(int[] arr) {
        /*
            这里要判断数组为null
            这里对数组为null和长度为0分开做出不同的应对
            这里同样要判断==null
            因为这样if大括号中的代码可以尽量少
         */
        if (arr == null) {
            System.out.println("您输入的数组是null数组,请重新输入!");
            return;
        }
        // 代码运行到这里,数组引用肯定不是null
        if (arr.length == 0) {
            System.out.println("您输入的数组是长度为0的数组,请重新输入!");
            return;
        }
        // 代码运行到这里,数组肯定是一个正常数组,不是null,长度也不是0
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            // 如果是最后一个元素就不加逗号和空格了
            if (i == arr.length - 1) {
                System.out.print(arr[i]);
                break;
            }
            System.out.print(arr[i] + ", ");
        }
        System.out.println("]");
    }

    /*
        最后一个改进:
            同时处理null数组和长度为0的数组
     */
    public static void traverse7(int[] arr) {
        // 标准格式,固定格式
        if (arr == null || arr.length == 0) {
            System.out.println("您输入的数组不是正常数组,请重新输入!");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            // 如果是最后一个元素就不加逗号和空格了
            if (i == arr.length - 1) {
                System.out.print(arr[i]);
                break;
            }
            System.out.print(arr[i] + ", ");
        }
        System.out.println("]");
    }
}
